阿里云服务器ECS环境搭建及配置

关于跬步应用的服务器部署过程,程序通过python编写,部署在阿里ECS云服务器上。

系统基本信息

登陆 阿里云服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Ubuntu 12.04 
CPU 1核
内存 512M 带宽1M
所在可用区: 青岛可用区B
 
服务器登陆名:
root
 
服务器登录密码:
**********
 
IP地址:
115.28.200.109
10.144.82.22 内

部署前的准备

安装Xshell

登陆服务器进行服务的部署
首先检查 python版本

1
2
3
4
5
6
7
8
9
python –v  
创建目录
mkdir /home/kuibu/
mkdir /kuibu/images/
mkdir /kuibu/images/user_photos/
mkdir /kuibu/images/topic/
mkdir /kuibu/images/cover
mkdir /kuibu/images/thumbnail/
mkdir /kuibu/log/

安装WINSCP (或者其他FTP客户端),服务端需安装配置vsftp(具体见附录一)

登陆用来上传文件,还可以用来查看文件结构

安装mysql 及mysqldb

1
2
3
sduo Apt-get update 
sudo apt-get mysql-server
sudo apt-get python-mysqldb

安装nginx

1
2
sudo apt-get nginx  
sudo /etc/init.d/nginx start

Nginx的配置文件是/etc/nginx/nginx.conf,具体的配置信息见后.

安装后在本地测试是否成功http://115.28.200.109/

Mysql 服务

客户端连接服务端的问题,安装完mysql 后,为客户端创建一个用户

1
2
3
4
5
6
Use mysql ; 
CREATE USER kuibu IDENTIFIED BY “123”
123为远端的登录密码
 
Grant all privileges on *.* to ‘ kuibu’@’%’ WITH GRANT OPTION
kuibu 表示用户 % 表示远端的任意主机 如果主机IP知道了就不要这么设置了

搭建环境

  1. 下载virtualenv.py (这里使用已经下载好的,后面的可以略过)
1
2
3
4
5
6
7
通过命令
$sudo easy_install virtualenv
或者
$sudo pip install virtualenv

Unbuntu 下可以通过软件包管理
Sudo apt-get install python-virtualenv
  1. 创建虚拟环境
1
2
3
4
5
cd 到 /home/kuibu/
$ virtualenv flask 或者使用下载好的virtualenv.py 创建 python virtualenv.py flask ;

每次使用时首先激活虚拟环境
$ source ./flask/bin/activate

3. 创建项目目录

mkdir /flask/apps/ 其中存放我们服务端项目的代码
 
4. 安装flask
完成上面的步骤,接下来就来安装flask等其附属的第三方模块:

1
2
3
4
5
6
7
8
9
10
$ flask/bin/pip install flask
$ flask/bin/pip install flask-sqlalchemy
$ flask/bin/pip install flask-httpauth
$ flask/bin/pip install redis
$ flask/bin/pip install MySQL-python #mysqldb
$ flask/bin/pip install passlib
$flask/bin/pip install flask-socketio
$flask/bin/pip install PIL (具体看附录的PIL安装)
nginx配置
sudo apt-get nginx 这里需要>1.4的稳定版

获取最新版nginx稳定版参见
http://www.kaijia.me/2013/05/ubuntu-latest-nginx-repo-collection/

1
sudo /etc/init.d/nginx start

配置文件 /etc/nginx/sites-avaliable/default, nginx的优化配置文件在/etc/nginx/nginx.conf

部署

基本架构 nginx + flask + gunicorn + gevent

Nginx反向代理及配置

跬步使用到socketio, 部署要使用 gunicorn  作为web服务容器,所以首先要安装先切换到虚拟环境,然后pip install gunicorn 即可,详见http://gunicorn.org/ ,注意这里需要加上版本号 pip install gunicorn==18.0
gunicorn 作为web服务容器,前端使用nginx做反向代理,配置如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://127.0.0.1:5000;
proxy_redirect off;
 
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /socket.io {
proxy_pass http://127.0.0.1:5000/socket.io;
proxy_redirect off;
proxy_buffering off;
 
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
location ~ ^/(images|javascript|js|css|flash|media|static|files)/{
root /home/kuibu/ ;
expires 30d ;
}
}

重启nginx

配置gunicorn

在项目目录下编写配置文件gunicorn.conf
 
先切换到项目目录 cd apps ;
编写配置文件gunicorn.conf

1
2
3
4
5
6
7
8
9
10
workers = 4
backlog = 2048
bind = '127.0.0.1:5000'
worker_class="socketio.sgunicorn.GeventSocketIOWorker" #sync,gevent,meinheld,socketio.sgunicorn.GeventSocketIOWorker
proc_name='kuibu'
pidfile= '/tmp/kuibu.pid'
logfile = '/home/kuibu/log/debug.log'
debug=True
daemon=True
errorlog='/home/kuibu/log/error.log'
1
..bin/gunicorn --config gunicorn.conf run:app

启动成功后,通过命令查看后台进程

1
ps -ef | grep kuibu

参考链接

  1. http://flask-socketio.readthedocs.org/en/latest/
  2. http://www.open-open.com/lib/view/open1423107543014.html

使用 supervisor 管理gunicorn 进程

基本用法

1
2
3
4
##sudo安装 sudo apt-get install supervisor 
##启动服务 sudo service supervisor start
##终止服务 sudo service supervisor stop
##也可以直接kill pid ps -A | grep supervisor

参考配置

配置示例

  1. 文件内容
1
[program:dylan]
  1. 注意项目目录和gunicorn的配置文件地址
1
2
3
4
command=/home/bob/dylan/bin/gunicorn runserver:app -c /home/bob/dylan/gunicorn.conf directory=/home/bob/dylan 
user=root
autostart=true
autorestart=true
  1. log文件的位置
1
stdout_logfile=/home/bob/logs/gunicorn_supervisor.log
  1. 重新读取配置
1
2
3
4
5
6
sudo supervisorctl reread
##启动服务 sudo supervisorctl start kuibu
##停止服务 sudo supervisorctl stop kuibu
##有问题就重启supervisor的总服务
sudo service supervisor stop
sudo service supervisor start

通过浏览器管理supervisor

  1. 配置/etc/supervisor/supervisord.conf 添加以下内容
1
2
3
4
5
6
7
8
9
10
11
[unix_http_server]
file=/var/run//supervisor.sock ; (the path to the socket file)
chmod=0700 ; sockef file mode (default 0700)
chown=nobody:nogroup
username = esli
password = 123
 
[inet_http_server]
port = 127.0.0.1:9001
username = esli
password = 123

详见 http://supervisord.org/configuration.html#inet-http-server-section-settings

2. 在对应的nginx配置中添加

1
2
3
4
5
6
7
8
9
10
11
12
13
location /supervisor {
proxy_pass http://127.0.0.1:9001/;
proxy_redirect off;
proxy_buffering off;
 
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}

这样我们就可以远程对其进行管理。

测试

  1. 安装ab测试工具
    sudo apt-get install apache2-utils
  2. 简单测试
    $time ab -n 200 -c 200 http://115.28.200.109/caddy/api/v1.0/test
  3. 实际测试
    time ab -n 2000 -c 1000 -H keywords:dt -p /home/kuibu/param.conf -T ‘application/json; charset=utf8’ http://115.28.200.109/caddy/api/v1.0/get_collections
     
    其中params.conf 的内容如下:
     
    data_type=HOME_LIST&uid=9&action=INIT&threshold=-1
  4. 压力测试结果
    在远程对web服务器进行压力测试,往往效果不理想(因为网络延时过大),建议使用内网的另一台或者多台服务器通过内网进行测试,这样得出的数据,准确度会高很多。如果只有单独的一台服务器,可以直接本地测试,比远程测试效果要准确。
     
    关于ab的使用,参考 http://www.ha97.com/4617.html

附录一 安装其他模块

Ubuntu/Debian安装vsftp软件

  1. 更新软件源
    首先需要更新系统的软件源,便捷工具下载地址:http://help.aliyun.com/manual?spm=0.0.0.0.zJ3dBU&helpId=1692
  2. 安装vsftp
    使用apt-get命令安装vsftp
1
#apt-get install vsftpd –y
  1. 添加ftp帐号和目录
    先检查一下nologin的位置,通常在/usr/sbin/nologin或者/sbin/nologin下。使用下面的命令创建帐户,该命令指定了/alidata/www/wwwroot为用户pwftp的家目录,您可以自己定义帐户名和目录:
1
2
3
4
5
6
7
#useradd -d /alidata/www/wwwroot -s /sbin/nologin pwftp
 
修改该帐户密码:
#passwd pwftp
 
修改指定目录的权限
#chown -R pwftp.pwftp /alidata/www/wwwroot
  1. 配置vsftp
    编辑vsftp配置文件,命令如下:
1
#vi /etc/vsftpd.conf

将配置文件中”anonymous_enable=YES “改为 “anonymous_enable=NO”
取消如下配置前的注释符号:

1
2
3
4
5
local_enable=YES
write_enable=YES
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list

保存退出,编辑/etc/vsftpd.chroot_list文件,将ftp的帐户名添加进去,保存退出

  1. 修改shell配置
    vi编辑/etc/shells,如果该文件里没有/usr/sbin/nologin或者/sbin/nologin(具体看当前系统配置)则追加进去

  2. 重启vsftp服务并测试登录,使用命令启动vsftp服务:

1
#service vsftpd restart

然后用帐号pwftp测试下是否可以登陆ftp。目录是/alidata/www/wwwroot。

PIL安装

具体参见 http://jinvan.com/post/install-pil-on-ubuntu

  1. 安装依赖包
1
sudo apt-get install libjpeg8-dev zlib1g-dev libfreetype6-dev

2. 创建链接,因为PIP安装软件包时,并没有安装在系统路径里,因此做一个软连接。

1
2
3
ln -s /usr/lib/`uname -i`-linux-gnu/libfreetype.so /usr/lib/
ln -s /usr/lib/`uname -i`-linux-gnu/libjpeg.so /usr/lib/
ln -s /usr/lib/`uname -i`-linux-gnu/libz.so /usr/lib/
  1. 准备工作做好了,安装PIL
1
2
sudo pip install pil 
sudo pip install PIL --allow-external PIL --allow-unverified PIL

附录二 Error 汇总

  1. 安装Mysql-python 报错
    Python.h: No such file or directory 需要
1
$ sudo apt-get install python-dev

2. IOError: [Errno 26] Text file busy: ‘flask/bin/python’
Lsof

1
unlink flask/bin/python
  1. greenlet.h:8:20: fatal error: Python.h: No such file or directory
1
解决 sudo apt-get install python-dev

4. 安装MySQL-python EnvironmentError: mysql_config not found

1
sudo apt-get install libmysqlclient-dev

5. 关于使用flask - socketio

1
2
3
../bin/gunicorn -c gunicorn.conf run:app
使用socketio.sgunicorn.GeventSocketIOWorker 代替了 gevent
报错AttributeError: 'socket' object has no attribute 'cfg_addr'

这是由于gunicorn 版本问题引起的,当前版本如果>18.0 修会出现这个问题,
所以需要将当前版本回归到18.0及以下
 
https://github.com/miguelgrinberg/Flask-SocketIO/issues/93

附录三 Linux命令

  1. 杀死服务进程
    ps -ef | grep kuibu
    kill -s 9 24578

  2. 查看目录权限
    ll

  3. 查看内存使用
    free –m
    top

坚持原创技术分享,您的支持将鼓励我继续创作!